package com.ftg.learn.chapter17.mystatck;

/**
 * @author KangJx
 * @date 2021/8/5
 */
public class StackImple implements IMyStack {

    //1、把我们一起写完的东西，大家写一遍？
    //2、自己再编写一个实现类，这个实现类底层要求你用链表实现

    //3、我们要看一看jdk stack 方法 (数据结构 与 自己编写 与 jdk原带)

    /**
     * 栈元素
     */
    private int[] obj;

    /**
     * 栈顶
     */
    private int index;

    /**
     * 默认大小
     */
    private final int defalt_size = 10;

    /**
     * 增量 | 阈值 0.75
     */
    private int increment;

    public StackImple(){
        this.obj = new int[defalt_size];
    }

    public StackImple(int capcity){

        if(capcity <= 0){
            throw new IllegalArgumentException("参数不合规，容器不能小于0");
        }
        this.obj = new int[capcity];
    }

    public StackImple(int capcity,int increment){

        if(capcity <= 0){
            throw new IllegalArgumentException("参数不合规，容器不能小于0");
        }
        this.obj = new int[capcity];
        this.increment = increment;

    }

    /**
     * 我想用数组的方式来完成一个栈的代码编写,
     *  -- 我们首先要有一个数组，用来存储大量元素
     *  -- 下标(不应该让外面知道 )
     */

    /**
     * 满了
     * @param val
     * @return
     */
    @Override
    public boolean push(int val) {
        graw(this.obj.length,index,this.obj.length);
        this.obj[index++] = val;
        return true;
    }

    /**
     * 我们自己的扩容 方法
     * @param len
     * @param index
     * @param oldCapcity
     */
    private void graw(int len,int index,int oldCapcity){

        if(len - index <= 0){
            //扩展三种情况  0.5 0.75 1  默认是增加原长度一倍
            int newCapcity = oldCapcity + (increment == 0 ? oldCapcity : increment);
            int[] abc = new int[newCapcity < Integer.MAX_VALUE?newCapcity:Integer.MAX_VALUE];
            //main里面试一下创建一个数组 【integer.max_value+5】
            System.arraycopy(this.obj,0,abc,0,this.obj.length);
            this.obj = abc;
        }
    }

    @Override
    public Object pop() {
        // 真  执行第二个  理想情况三不会走
        // Numberformatexception  IllegeArgmentException nullpointerexception
        return index ==0 ? null : this.obj[--index];
    }

    @Override
    public Object getPop() {
        return index ==0 ? null : this.obj[index-1];
    }

//    @Override
//    public int size() {
//        return index;
//    }

}
